<?php
/**
 *  PayController.class.php
 * ============================================================================
 * 版权所有 (C) 2015-2016 壹尚科技有限公司，并保留所有权利。
 * 网站地址:   http://www.ethank.com.cn
 * ----------------------------------------------------------------------------
 * 许可声明：这是一个开源程序，未经许可不得将本软件的整体或任何部分用于商业用途及再发布。
 * ============================================================================
 * Author: 勾国印 (gouguoyin@ethank.com.cn) 
 * Date: 2015年8月13日 下午5:13:14  
*/
namespace Home\Controller;
use Think\Controller;
class WxpayController extends Controller {
    //初始化
    public function _initialize(){
      //引入WxPayPubHelper
      vendor('WxPayPubHelper.WxPayPubHelper');
    }
    //生成二维码
    public function wx_pay(){
    	$where['id'] = I('order_id');
      $data = M('indent')->Field('order_num,money')->where($where)->find();
      if(!$data){
        echo "订单号不存在!<a href='".U('Personal/order_detail',array('id'=>I('order_id')))."''>返回</a>";die;
      }
      //使用统一支付接口
      $unifiedOrder = new \UnifiedOrder_pub();
      //设置统一支付接口参数
      //设置必填参数
      $unifiedOrder->setParameter("body","维修服务");//商品描述
      //自定义订单号，此处仅作举例
      $out_trade_no = $data['order_num'];
      $unifiedOrder->setParameter("out_trade_no","$out_trade_no");//商户订单号 
      //$unifiedOrder->setParameter("total_fee",$data['money'] * 100);//总金额
      $unifiedOrder->setParameter("total_fee",'1');//总金额
      $unifiedOrder->setParameter("notify_url", 'http://www.alywt.com/index.php/Home/Wxpay/notify');//通知地址 
      $unifiedOrder->setParameter("trade_type","NATIVE");//交易类型
      //非必填参数，商户可根据实际情况选填
      //$unifiedOrder->setParameter("sub_mch_id","XXXX");//子商户号  
      //$unifiedOrder->setParameter("device_info","XXXX");//设备号 
      //$unifiedOrder->setParameter("attach","XXXX");//附加数据 
      //$unifiedOrder->setParameter("time_start","XXXX");//交易起始时间
      //$unifiedOrder->setParameter("time_expire","XXXX");//交易结束时间 
      //$unifiedOrder->setParameter("goods_tag","");//商品标记 
      //$unifiedOrder->setParameter("openid",$openid);//用户标识
      //$unifiedOrder->setParameter("product_id","XXXX");//商品ID
      //获取统一支付接口结果
      $unifiedOrderResult = $unifiedOrder->getResult();
      //var_dump($unifiedOrder);
      //商户根据实际情况设置相应的处理流程
      if ($unifiedOrderResult["return_code"] == "FAIL"){
        //商户自行增加处理流程
        echo "通信出错：".$unifiedOrderResult['return_msg']."<br>";
      }elseif($unifiedOrderResult["result_code"] == "FAIL"){
        //商户自行增加处理流程
        echo "错误代码：".$unifiedOrderResult['err_code']."<br>";
        echo "错误代码描述：".$unifiedOrderResult['err_code_des']."<br>";
      }elseif($unifiedOrderResult["code_url"] != NULL){
          //从统一支付接口获取到code_url
          $code_url = $unifiedOrderResult["code_url"];
          //商户自行增加处理流程
          //......
      }
      $this->assign('id',I('order_id'));
      $this->assign('out_trade_no',$out_trade_no);
      $this->assign('code_url',$code_url);
      $this->assign('unifiedOrderResult',$unifiedOrderResult);
      $this->display();
    }
    //回调方法（当向微信平台付完钱之后，微信平台返回相关的值，进行订单状态处理【业务逻辑处理】[回调方法里面是打印不了的，所以查看状态可以根据操作数据库查看是否进来此方法，或者，生成日志文件]）
    public function notify(){
      //使用通用通知接口
      $notify = new \Notify_pub();
      $send=A("Personal");  //跨控制器调用
      //存储微信的回调
      $xml = $GLOBALS['HTTP_RAW_POST_DATA'];
      file_put_contents('xml.txt',date('Y-m-d H:i:s').":\n"."【支付回调通知】:\n".$xml."\n",FILE_APPEND); //记录日志 支付成功后查看xml.txt文件是否有内容 如果有xml格式文件说明回调成功
      $notify->saveData($xml);
      $array_data=$notify->data;
      //验证签名，并回应微信。
      //对后台通知交互时，如果微信收到商户的应答不是成功或超时，微信认为通知失败，
      //微信会通过一定的策略（如30分钟共8次）定期重新发起通知，
      //尽可能提高通知的成功率，但微信不保证通知最终能成功。
      if($notify->checkSign() == FALSE){
          $notify->setReturnParameter("return_code","FAIL");//返回状态码
          $notify->setReturnParameter("return_msg","签名失败");//返回信息
      }else{
          $notify->setReturnParameter("return_code","SUCCESS");//设置返回码
      }
      $returnXml = $notify->returnXml();
      echo $returnXml;
      //==商户根据实际情况设置相应的处理流程，此处仅作举例=======
      $log_name= "notify_url.log";//log文件路径
      file_put_contents($log_name,date('Y-m-d H:i:s').":\n"."【接收到的notify通知】:\n".$xml."\n",FILE_APPEND);
      if($notify->checkSign() == TRUE){
          if ($notify->data["return_code"] == "FAIL") {
              //此处应该更新一下订单状态，商户自行增删操作
            file_put_contents($log_name,date('Y-m-d H:i:s').":\n"."【通信出错】:\n".$xml."\n",FILE_APPEND);
          }elseif($notify->data["result_code"] == "FAIL"){
              //此处应该更新一下订单状态，商户自行增删操作
            file_put_contents($log_name,date('Y-m-d H:i:s').":\n"."【业务出错】:\n".$xml."\n",FILE_APPEND);
          }else{
              //此处应该更新一下订单状态，商户自行增删操作
            file_put_contents($log_name,date('Y-m-d H:i:s').":\n"."【支付成功】:\n".$xml."\n",FILE_APPEND);
          }
          //业务逻辑处理【订单的状态修改等操作，在此处进行】
          $out_trade_no = $notify->data["out_trade_no"];
          $list['trade_no'] = $notify->data["transaction_id"];
          $list['status'] = 4;
          $list['status4_time'] = $notify->data["time_end"];
          $list['pay_code'] = 2;
          $tag = M('indent')->where("order_num='".$out_trade_no."'")->save($list);
          if($tag == 1){
            //消息（站内信）开始
            $msg_arr = M('indent')->where("order_num ='".$out_trade_no."'")->Field('partya_id,partya_role,partyb_id,partyb_role')->find();
            $message['partya_id'] = $msg_arr['partya_id'];
            $message['partya_role'] = $msg_arr['partya_role'];
            $message['partyb_id'] = $msg_arr['partyb_id'];
            $message['partyb_role'] = $msg_arr['partyb_role'];
            $message['create_time'] = date("Y-m-d H:i:s");
            $message['status'] = 1;
            $message['msg_content'] = "已向平台付款，请放心去维修吧";
            $msg = M('message')->add($message);
            //消息（站内信）结束
            //微信推送调用start
            $wx_res = M($msg_arr['partyb_role'])->where("id =".$msg_arr['partyb_id'])->getField('openid');
            if($wx_res){
                $value = $msg_name."已向平台付款，请放心去维修吧";
                $send->sendCustom($wx_res,$value);
            }
          //微信推送调用end
          }
      }
    }

    //查询订单
    public function orderQuery() {  
      //退款的订单号
      if (!isset($_POST["out_trade_no"])){
        $id = " ";
        $out_trade_no = " ";
      }else{
        $id = $_POST["id"];
        $out_trade_no = $_POST["out_trade_no"];
        //使用订单查询接口
        $orderQuery = new \OrderQuery_pub();
        //设置必填参数
        //appid已填,商户无需重复填写
        //mch_id已填,商户无需重复填写
        //noncestr已填,商户无需重复填写
        //sign已填,商户无需重复填写
        $orderQuery->setParameter("out_trade_no",$out_trade_no);//商户订单号 
        //非必填参数，商户可根据实际情况选填
        //$orderQuery->setParameter("sub_mch_id","XXXX");//子商户号  
        //$orderQuery->setParameter("transaction_id","XXXX");//微信订单号
        //获取订单查询结果
        $orderQueryResult = $orderQuery->getResult();
        //商户根据实际情况设置相应的处理流程,此处仅作举例
        if ($orderQueryResult["return_code"] == "FAIL") {
          $this->ajaxReturn(json_encode(array('code'=>0,'msg'=>'支付失败!')));
        }
        elseif($orderQueryResult["result_code"] == "FAIL"){
          $this->ajaxReturn(json_encode(array('code'=>0,'msg'=>'支付失败!')));
        }else{
             $i=$_SESSION['i'];
             $i--;
             $_SESSION['i'] = $i;
              //判断交易状态
              switch ($orderQueryResult["trade_state"]){
                  case SUCCESS:
                      $this->ajaxReturn(json_encode(array('code'=>200,'msg'=>'支付成功!页面跳转中...')));
                      break;
                  case REFUND:
                      $this->ajaxReturn(json_encode(array('code'=>201,'msg'=>'超时关闭订单:'.$i,'i'=>$i))); 
                      break;
                  case NOTPAY:
                  $this->ajaxReturn(json_encode(array('code'=>201,'msg'=>'超时关闭订单:'.$i,'i'=>$i))); 
                      break;
                  case CLOSED:
                      $this->ajaxReturn(json_encode(array('code'=>201,'msg'=>'超时关闭订单:'.$i,'i'=>$i))); 
                      break;
                  case PAYERROR:
                      $this->ajaxReturn(json_encode(array('code'=>201,'msg'=>'支付失败!'.$orderQueryResult["trade_state"]))); 
                      $this->success("支付失败".$orderQueryResult["trade_state"]);
                      break;
                  default:
                      $this->ajaxReturn(json_encode(array('code'=>201,'msg'=>'未知失败!'.$orderQueryResult["trade_state"]))); 
                      break;
              }
          }  
      }
    }
}
?>
